Skip to content

Dockerfile 文件内容制作指南

文件下载

docker-web(官方镜像源).zip

docker-web(来源dasctfbase).zip

文件包结构

文件包内应确保具有如下的文件。

  1. docker-compose.yml – Docker-Compose 描述文件
  2. web1 – 服务构建文件,下有 Dockerfile 和构建所需的文件等

docker-compose.yml

Docker-Compose 描述文件, 内容如下:

# 指定该文件版本
version: '3'
# 把每个子目录视为一个镜像,开始构建
services:
  web1:
    # 此处仅允许 image, build, ports,禁止其他字段出现,如果有 volume,cmd 等设置需求,请在 Dockerfile 里进行文件拷贝或者申明。
    build: ./web1/
    ports:
      - "18098:80"

此处仅允许 image, build, ports,禁止其他字段出现,如果有 volume,cmd 等设置需求,请在 Dockerfile 里进行文件拷贝或者申明!!!

此处仅允许 image, build, ports,禁止其他字段出现,如果有 volume,cmd 等设置需求,请在 Dockerfile 里进行文件拷贝或者申明!!!

此处仅允许 image, build, ports,禁止其他字段出现,如果有 volume,cmd 等设置需求,请在 Dockerfile 里进行文件拷贝或者申明!!!

ports 里映射的镜像端口请务必保证正确!

web1

服务构建文件,下有 Dockerfile 和构建所需的文件等。

Dockerfile 内容参考样例如下:

1.样例1

# 只允许使用下文中限定的镜像
FROM php:7.4-apache

# 拷贝支撑文件到临时目录。
COPY files /tmp/files/

# 拷贝源码到相应目录下。
COPY src /var/www/html/

# 执行命令,设置权限,安装依赖等。
# 在镜像启动阶段禁止执行需要长时间运行(编译等)以及需要访问互联网(安装包等)操作,此类操作请在此处完成。
# 命令请在一个 RUN 里执行,不要拆分成多个 RUN 以减小镜像体积。
RUN chown -R root:root /var/www/html/ && \
    chmod -R 755 /var/www/html && \
    mv /tmp/files/flag.sh / && \
    mv /tmp/files/start.sh / && \
    mv /tmp/files/db.sql /db.sql && \
    chmod +x /flag.sh /start.sh && \
    sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list && \
	  sed -i '/security/d' /etc/apt/sources.list && \
    apt-get update && \
    apt-get install libaio1 libnuma1 psmisc libmecab2 -y && \
    DEBIAN_FRONTEND=noninteractive dpkg -i /tmp/files/mysql-common_5.7.29-1debian10_amd64.deb && \
    DEBIAN_FRONTEND=noninteractive dpkg -i /tmp/files/mysql-community-client_5.7.29-1debian10_amd64.deb && \
    DEBIAN_FRONTEND=noninteractive dpkg -i /tmp/files/mysql-client_5.7.29-1debian10_amd64.deb && \
    DEBIAN_FRONTEND=noninteractive dpkg -i /tmp/files/mysql-community-server_5.7.29-1debian10_amd64.deb && \
    DEBIAN_FRONTEND=noninteractive dpkg -i /tmp/files/mysql-server_5.7.29-1debian10_amd64.deb && \
    rm -rf /tmp/files && \
    docker-php-ext-install mysqli pdo pdo_mysql && \
    rm -rf /var/lib/apt/lists/*

# 指定启动命令。
CMD /start.sh

# 申明环境变量,环境变量都在此声明
ENV DASFLAG DASCTF{test12345}

# 请务必在镜像末尾申明该镜像需要暴露的端口!
EXPOSE 80

2.样例2

# 只允许使用下文中限定的镜像
FROM dasctfbase/web_php73_apache_mysql

COPY ./src /var/www/html
# 如需自定义 FLAG 请将自定义脚本覆盖到 /flag.sh
COPY files/flag.sh /flag.sh
# 如需操作数据库请将 sql 文件拷贝到 /db.sql
COPY files/db.sql /db.sql

# 如有上传文件等操作请务必将权限设置正确!
# RUN chown www-data:www-data /var/www/html/uploads/
RUN /bin/bash && chmod 755 /var/www/html && \
    sed -i "1i \ServerName localhost:80" /etc/apache2/apache2.conf && \
    chmod +x /flag.sh

# 申明环境变量,这里有一个 /flag.sh 从环境变量中获取 flag,所以需要声明。
ENV DASFLAG DASCTF{test12345}

# 请声明对外暴露端口
EXPOSE 80

需要特别注意几点:

1. FROM 的基础镜像只允许是:

  1. Dockerhub上不带 / 的官方镜像
  2. dasctfbase 组织下的镜像,比如 dasctfbase/web_php73_apache_mysql
  3. https://github.com/orgs/DASCTF-Offical/packages 里的镜像,也就是 ghcr.io/dasctf-offical/ 开头的镜像

其他镜像一律不允许使用。

其他镜像一律不允许使用。

其他镜像一律不允许使用。

2. 请设置一个 DASFLAG 环境变量来作为预置的 flag 以供测试。

ENV DASFLAG DASCTF{test12345}

3. 请正确声明容器对外暴露的端口。

EXPOSE 80

4. CMD 及其附属的启动脚本禁止使用输出文字等方式来保持运行。

比如


while true; do
  echo '1'
done

禁止使用这种输出日志的方式来保持运行。

禁止使用这种输出日志的方式来保持运行。

禁止使用这种输出日志的方式来保持运行。

可以使用如下所示等方式来保持运行

# 方式一
tail -f /dev/null

# 方式二
sleep infinity